package com.otod.commons.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.cglib.beans.BeanMap;

import com.otod.base.exception.AppException;
import com.otod.commons.code.bo.BizCodeBo;
import com.otod.commons.entity.Page;
import com.otod.sys.code.service.ICodeService;
import com.otod.sys.vo.CodeInfoVo;


/**
 * 参数表获取
 * @author jqiu
 */
public class BizCodeUtil {
	private static Logger logger = LoggerFactory.getLogger(BizCodeUtil.class);
	
	private static Map<String, List<BizCodeBo>> BIZ_CODE = new HashMap<String, List<BizCodeBo>>();
	private static Map<String, BizCodeBo> BIZ_NO_BO = new HashMap<String, BizCodeBo>();		//<codeNo,BizCodeBo>
	
	/**
	 * 获取参数列表
	 * @param dictNo 参数类型
	 * @return
	 */
	public static List<BizCodeBo> getBizCodeList(String dictNo){
		List<BizCodeBo> newList = new ArrayList<BizCodeBo>();
		List<BizCodeBo> oldList = BizCodeUtil.BIZ_CODE.get(dictNo);
		
		if(oldList==null || oldList.size()==0){
			oldList = loadBizCode(dictNo);
		}
		
		BizCodeBo destBizCodeBo;
		for (BizCodeBo bizCodeBo : oldList) {
			destBizCodeBo = new BizCodeBo();
			BeanUtils.copyProperties(bizCodeBo,destBizCodeBo);
			newList.add(destBizCodeBo);
		}
		return newList;
	}
	
	
	/**
	 * 参数赋值
	 * @param dictNo 参数类型
	 * @return
	 */
	private static List<BizCodeBo> loadBizCode(String dictNo){
		ICodeService codeService = (ICodeService)SpringContextHolder.getBean(ICodeService.BEAN_Id);
		List<BizCodeBo> list = codeService.queryBizCodeBo(dictNo);
		BizCodeUtil.BIZ_CODE.put(dictNo, list);
		return list;
	}
	
	
	
	/**
	 * 参数通过编号取BizCodeBo
	 * @param dictNo	参数类型
	 * @param codeNo		参数编码(为空时返回空)
	 * @return	BizCodeBo	
	 * @throws AppException
	 */
	public static BizCodeBo getBizCodeByNo(String dictNo,String codeNo){
		if(StringUtils.isEmpty(codeNo)){
			return null;
		}

		List<BizCodeBo> CodeList  = getBizCodeList(dictNo);
		if(CodeList == null){
			return null;
		}
		for (BizCodeBo codeModel : CodeList) {
			if(codeModel.getCodeNo() != null && codeModel.getCodeNo().equals(codeNo)){
				return codeModel;
			}
		}
		return null;
	}
	
	/**
	 * 参数通过编号取name
	 * @param dictNo	参数类型
	 * @param codeNo	参数值(为空时返回空)
	 * @return	name	参数名
	 * @throws AppException
	 */
	public static String getBizCodeNameByNo(String dictNo,String codeNo){
		BizCodeBo bo = BizCodeUtil.getBizCodeByNo(dictNo, codeNo);
		if(bo==null){
			return "";
		}
		return bo.getCodeName();
	}
	
	/**
	 * 参数通过编号取name
	 * @param dictNo	参数类型
	 * @param codeNo	参数值(为空时返回空)
	 * @return	name	参数名
	 * @throws AppException
	 */
	public static String getBizCodeNameByNo(String codeNo){
		if(BIZ_NO_BO.isEmpty()){
			ICodeService codeService = (ICodeService)SpringContextHolder.getBean(ICodeService.BEAN_Id);
			List<CodeInfoVo> list = codeService.queryCodeInfoAll();
			BizCodeBo bo;
			for (CodeInfoVo codeInfoVo : list) {
				bo = new BizCodeBo();
				BeanUtils.copyProperties(codeInfoVo, bo);
				BIZ_NO_BO.put(bo.getCodeNo(), bo);
			}
		}
		BizCodeBo bo = BIZ_NO_BO.get(codeNo);
		if(bo==null){
			return "";
		}
		return bo.getCodeName();
	}
	
	/**
	 * 参数通过name取value
	 * @param dictNo	参数类型
	 * @param codeName	参数名(为空时返回空)
	 * @return	name	参数值
	 * @throws AppException
	 */
	public static String getBizCodeNoByName(String dictNo,String codeName){
		if(StringUtils.isEmpty(codeName)){
			return "";
		}

		List<BizCodeBo> CodeList  = getBizCodeList(dictNo);
		if(CodeList == null){
			return "";
		}
		for (BizCodeBo codeModel : CodeList) {
			if(codeName.equals(codeModel.getCodeName())){
				return codeModel.getCodeNo();
			}
		}
		return "";
	}
	
	/**
	 * 为参数名赋值
	 * @param dictNo			类别
	 * @param codeNoField		参数编号取值字段
	 * @param codeNameField		参数名字赋值段
	 * @param bean				Bean实例
	 */
	public static void putCodeName(String dictNo,String codeNoField,String codeNameField,Object bean){
		BeanMap map = BeanMap.create(bean);
		String codeNo = (String)map.get(codeNoField);
		String codeName = BizCodeUtil.getBizCodeNameByNo(dictNo, codeNo);
		map.put(codeNameField, codeName);
	}
	
	/**
	 * 为参数名赋值(注意，如果一个page需要多次赋值，请不要多次重复调用此方法)
	 * @param dictNo			类别
	 * @param codeNoField		参数编号取值字段
	 * @param codeNameField		参数名字赋值段
	 * @param page				翻页实例
	 */
	public static void putCodeName(String dictNo,String codeNoField,String codeNameField,Page page){
		List list = page.getAaData();
		for (Object object : list) {
			BizCodeUtil.putCodeName(dictNo, codeNoField, codeNameField, object);
		}
	}
}
